// 给定⼀个链表，两两交换其中相邻的节点，并返回交换后的链表。
// 你不能只是单纯的改变节点内部的值，⽽是需要实际的进⾏节点交换。
// 示例 1：
// 输⼊：head = [1,2,3,4]
// 输出：[2,1,4,3]
// 示例 2：
// 输⼊：head = []
// 输出：[]

class ListNode {
  constructor (val, next = null) {
    this.val = val
    this.next = next
  }
}

// 第一个链表
const list1 = new ListNode(1)
const node11 = new ListNode(2)
list1.next = node11
const node12 = new ListNode(3)
node11.next = node12
const node13 = new ListNode(4)
node12.next = node13

// 创建一个临时变量 next，保存当前节点 head 的下一个节点 head.next。
// 将当前节点 head 的 next 指针指向 next.next，即跳过下一个节点。
// 将 next 的 next 指针指向当前节点 head，实现两个节点的交换。
// 将 prev 的 next 指针指向 next，将交换后的节点连接到链表中。
// 最后，更新指针 prev 和 head，使其指向下一组待交换的节点

function swapPairs (head) {
  // 先设一个虚拟节点，用来接收这些数据,最后返回它的next就可以了
  let dummy = new ListNode(0)
  dummy.next = head
  // prev 是一个指针变量，用于指向当前节点 head 的前一个节点。它的作用是在交换节点时，将前一个节点与交换后的节点连接起来，以保持链表的连续性
  let prev = dummy
  // 如果有head和他的next，那这两个节点就需要交换
  if (head && head.next) {
    // 其实就是节点的两两交换
    const next = head.next // 临时保存head.next，因为head.next待会要改变
    head.next = next.next
    next.next = head
    prev.next = next

    prev = head // 指针更新
    head = head.next // 指针更新
  }
  return dummy.next
}

let m = swapPairs(list1)
while (m !== null) {
  console.log(m.val)
  m = m.next
}
